package com.blog.cmrpersonalblog.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.blog.cmrpersonalblog.entity.UserLike;
import com.blog.cmrpersonalblog.dto.user.response.UserInteractionResponse;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 用户点赞Mapper接口
 */
public interface UserLikeMapper extends BaseMapper<UserLike> {

    /**
     * 获取用户对指定目标的点赞状态
     * @param userId 用户ID
     * @param targetId 目标ID
     * @param targetType 目标类型
     * @return 点赞记录
     */
    UserLike selectUserLikeStatus(@Param("userId") Long userId, 
                                  @Param("targetId") Long targetId, 
                                  @Param("targetType") Integer targetType);

    /**
     * 批量获取用户对多个目标的点赞状态
     * @param userId 用户ID
     * @param targetIds 目标ID列表
     * @param targetType 目标类型
     * @return 点赞记录列表
     */
    List<UserLike> selectBatchUserLikeStatus(@Param("userId") Long userId, 
                                            @Param("targetIds") List<Long> targetIds, 
                                            @Param("targetType") Integer targetType);

    /**
     * 更新或插入点赞状态
     * @param userLike 点赞对象
     * @return 影响行数
     */
    int insertOrUpdateUserLike(UserLike userLike);

    /**
     * 统计目标的点赞数
     * @param targetId 目标ID
     * @param targetType 目标类型
     * @return 点赞数
     */
    Long countLikesByTarget(@Param("targetId") Long targetId, 
                           @Param("targetType") Integer targetType);

    /**
     * 批量统计多个目标的点赞数
     * @param targetIds 目标ID列表
     * @param targetType 目标类型
     * @return 点赞统计列表
     */
    List<Long> countBatchLikesByTargets(@Param("targetIds") List<Long> targetIds, 
                                       @Param("targetType") Integer targetType);

    /**
     * 获取用户点赞的目标列表
     * @param userId 用户ID
     * @param targetType 目标类型
     * @return 目标ID列表
     */
    List<Long> selectUserLikedTargets(@Param("userId") Long userId, 
                                     @Param("targetType") Integer targetType);

    /**
     * 获取用户点赞的文章列表
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 点赞的文章信息列表
     */
    List<UserInteractionResponse.LikedArticleInfo> selectUserLikedArticles(@Param("userId") Long userId,
                                                                           @Param("limit") Integer limit);

    /**
     * 分页获取用户点赞的文章列表
     * @param page 分页对象
     * @param userId 用户ID
     * @return 点赞的文章分页列表
     */
    IPage<UserInteractionResponse.LikedArticleInfo> selectUserLikedArticlesPage(Page<UserInteractionResponse.LikedArticleInfo> page,
                                                                                 @Param("userId") Long userId);
}
